From 385b7a303112848c5e5fa7bdffd31cdd5af4b247 Mon Sep 17 00:00:00 2001 From: Stef Walter Date: Wed, 19 Oct 2011 13:17:18 +0200 Subject: [PATCH] gtk: GtkToolbar returns invalid paths when adding tool items * Calculate siblings_path on demand, so that it's always correct and doesn't get out of sync with the toolbar state. https://bugzilla.gnome.org/show_bug.cgi?id=662177 --- gtk/gtktoolbar.c | 53 +++++++++++++++++------------------------------- 1 file changed, 19 insertions(+), 34 deletions(-) diff --git a/gtk/gtktoolbar.c b/gtk/gtktoolbar.c index ba6ccb5c16..2bd9be7d5d 100644 --- a/gtk/gtktoolbar.c +++ b/gtk/gtktoolbar.c @@ -121,8 +121,6 @@ struct _GtkToolbarPrivate GTimer *timer; - GtkWidgetPath *sibling_path; - gulong settings_connection; gint idle_id; @@ -3163,9 +3161,6 @@ gtk_toolbar_finalize (GObject *object) GtkToolbar *toolbar = GTK_TOOLBAR (object); GtkToolbarPrivate *priv = toolbar->priv; - if (priv->sibling_path != NULL) - gtk_widget_path_unref (priv->sibling_path); - g_list_free_full (priv->content, (GDestroyNotify)toolbar_content_free); g_timer_destroy (priv->timer); @@ -3308,7 +3303,7 @@ toolbar_content_new_tool_item (GtkToolbar *toolbar, content->is_placeholder = is_placeholder; priv->content = g_list_insert (priv->content, content, pos); - + gtk_widget_set_parent (GTK_WIDGET (item), GTK_WIDGET (toolbar)); gtk_toolbar_invalidate_order (toolbar); @@ -3938,37 +3933,34 @@ gtk_toolbar_get_path_for_child (GtkContainer *container, GtkWidgetPath *path; GtkToolbar *toolbar; GtkToolbarPrivate *priv; + GtkWidgetPath *sibling_path; gint vis_index; + GList *children; toolbar = GTK_TOOLBAR (container); priv = toolbar->priv; - if (priv->sibling_path == NULL) - { - GList *children; - - /* build a path for all the visible children; - * get_children works in visible order - */ - priv->sibling_path = gtk_widget_path_new (); - children = _gtk_container_get_all_children (container); + /* build a path for all the visible children; + * get_children works in visible order + */ + sibling_path = gtk_widget_path_new (); + children = _gtk_container_get_all_children (container); - if (priv->orientation != GTK_ORIENTATION_HORIZONTAL || - gtk_widget_get_direction (GTK_WIDGET (toolbar)) != GTK_TEXT_DIR_RTL) - children = g_list_reverse (children); + if (priv->orientation != GTK_ORIENTATION_HORIZONTAL || + gtk_widget_get_direction (GTK_WIDGET (toolbar)) != GTK_TEXT_DIR_RTL) + children = g_list_reverse (children); - g_list_foreach (children, add_widget_to_path, priv->sibling_path); - g_list_free (children); - } + g_list_foreach (children, add_widget_to_path, sibling_path); + g_list_free (children); path = gtk_widget_path_copy (gtk_widget_get_path (GTK_WIDGET (container))); if (gtk_widget_get_visible (child)) { vis_index = gtk_toolbar_get_visible_position (toolbar, child); - if (vis_index < gtk_widget_path_length (priv->sibling_path)) + if (vis_index < gtk_widget_path_length (sibling_path)) gtk_widget_path_append_with_siblings (path, - priv->sibling_path, + sibling_path, vis_index); else gtk_widget_path_append_for_widget (path, child); @@ -3976,23 +3968,16 @@ gtk_toolbar_get_path_for_child (GtkContainer *container, else gtk_widget_path_append_for_widget (path, child); + gtk_widget_path_unref (sibling_path); return path; } static void gtk_toolbar_invalidate_order (GtkToolbar *toolbar) { - GtkToolbarPrivate *priv = toolbar->priv; - - if (priv->sibling_path != NULL) - { - gtk_widget_path_unref (priv->sibling_path); - priv->sibling_path = NULL; - - gtk_container_forall (GTK_CONTAINER (toolbar), - (GtkCallback) gtk_widget_reset_style, - NULL); - } + gtk_container_forall (GTK_CONTAINER (toolbar), + (GtkCallback) gtk_widget_reset_style, + NULL); } static void -- 2.30.2